package com.hll.api.util;

import sun.misc.BASE64Encoder;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.GeneralSecurityException;
import java.security.MessageDigest;
import java.util.*;

/**
 * 签名工具类
 *
 * @author 何龙
 * @create 2019-06-02 0:10
 */
public class SignUtils {





	/**
	 * 和风天气签名生成算法-JAVA版本
	 *
	 * @param params 请求参数集，所有参数必须已转换为字符串类型
	 * @param secret 签名密钥（用户的认证key）
	 * @return 签名
	 */
	public static String hefengSign(HashMap<String, Object> params, String secret) throws IOException {
		Set<Map.Entry<String, Object>> entries = params.entrySet();
		HashMap<String, String> p = new HashMap<>();
		for (Map.Entry<String, Object> entry : entries) {
			p.put(entry.getKey(), entry.getValue().toString());
		}
		// 先将参数以其参数名的字典序升序进行排序
		Map<String, String> sortedParams = new TreeMap<>(p);
		Set<Map.Entry<String, String>> entry = sortedParams.entrySet();

		// 遍历排序后的字典，将所有参数按"key=value"格式拼接在一起

		StringBuilder baseString = new StringBuilder();
		for (Map.Entry<String, String> param : entry) {
			// sign参数 和 空值参数 不加入算法
			if (param.getValue() != null && !"".equals(param.getKey().trim()) && !"sign".equals(param.getKey().trim()) && !"key".equals(param.getKey().trim())
					&& !"".equals(param.getValue().trim())) {
				baseString.append(param.getKey().trim()).append("=").append(param.getValue().trim()).append("&");
			}
		}
		if (baseString.length() > 0) {
			baseString.deleteCharAt(baseString.length() - 1).append(secret);
		}

		// 使用MD5对待签名串求签
		try {
			MessageDigest md5 = MessageDigest.getInstance("MD5");
			byte[] bytes = md5.digest(baseString.toString().getBytes(StandardCharsets.UTF_8));
			return new BASE64Encoder().encode(bytes);
		} catch (GeneralSecurityException ex) {
			throw new IOException(ex);
		}
	}
}
